package com.xxxtea.config.converter;

import com.xxxtea.dto.Location;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * MyBatis-Location类型处理器
 * 
 * 用于将Location对象与数据库字符串字段进行相互转换。
 * 支持Location对象的序列化与反序列化，便于地理位置数据的存储与读取。
 * 
 * @author badman
 * @since 1.0.0
 */
public class LocationTypeHandler extends BaseTypeHandler<Location> {
	/**
	 * 设置非空参数，将Location对象转为字符串存入数据库
	 * 
	 * @param ps 预编译语句
	 * @param i 参数索引
	 * @param parameter Location对象
	 * @param jdbcType JDBC类型
	 * @throws SQLException SQL异常
	 */
	@Override
	public void setNonNullParameter(PreparedStatement ps, int i, Location parameter, JdbcType jdbcType) throws SQLException {
		ps.setString(i, parameter.toString());
	}

	/**
	 * 通过列名获取结果，将字符串转为Location对象
	 */
	@Override
	public Location getNullableResult(ResultSet rs, String columnName) throws SQLException {
		return Location.of(rs.getString(columnName));
	}

	/**
	 * 通过列索引获取结果，将字符串转为Location对象
	 */
	@Override
	public Location getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
		return Location.of(rs.getString(columnIndex));
	}

	/**
	 * 通过CallableStatement获取结果，将字符串转为Location对象
	 */
	@Override
	public Location getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
		return Location.of(cs.getString(columnIndex));
	}
}
